package com.zw.a.basic.a15.demo03_reflect;

import com.itheima.pojo.Student;

//案例: 反射入门, 演示获取类的字节码文件对象.
/*
    反射简介:
        概述:
            反射指的就是在程序的运行期间, 通过类的字节码文件对象, 来使用类中的成员的一项技术(成员变量, 构造方法, 成员方法).
        获取类的字节码文件对象的3种方式:
            方式1: 类名.class属性
                作用: 一般当做锁对象使用.
            方式2: 对象名.getClass()方法
                作用: 一般用来判断两个对象是否是同一个类型的对象.
            方式3: Class.forName("全类名");
                作用: 一般需要结合反射使用
   细节:
      一个.java文件, 对应一个.class文件, 即: 一个java文件只有一个 字节码文件对象.
 */
public class Demo01 {
    public static void main(String[] args) throws ClassNotFoundException {
        //演示:  获取类的字节码文件对象的3种方式:
        //方式1: 类名.class属性
        Class<Student> clazz1 = Student.class;

        //方式2: 对象名.getClass()方法
        //?表示泛型的通配符, 即: 可以用来表示任意的数据类型
        //? extends Student:  向下限定, 这里的?必须是 Student类或者其子类对象
        //? super Student:    向上限定, 这里的?必须是 Student类或者其父类
        Class<? extends Student> clazz2 = new Student().getClass();

        //方式3: Class.forName("全类名");
        Class<?> clazz3 = Class.forName("com.itheima.pojo.Student");


        //验证结论: 一个.java文件, 对应一个.class文件, 即: 一个java文件只有一个 字节码文件对象.
        System.out.println(clazz1 == clazz2);
        System.out.println(clazz1 == clazz3);
        System.out.println(clazz2 == clazz3);
    }
}
